package com.cctc.juc.common.util;

/**
 * [sout 控制台（日志）打印] 工具类。
 */
public class Print {

    /**
     * o 输出：日志内容
     * - o [output]
     */
    public static void o(Object output) {
        /**
         * 异步输出：提交线程池进行独立输出，使得输出不影响当前线程的执行。
         * 好处：不会造成输出乱序，也不会造成当前线程阻塞。
         */
        ThreadUtils.scheduleAtSeqExecute(() -> {
            System.out.println(output);
        });
    }

    /**
     * to 输出格式：[执行线程] 日志内容
     * - t [thread]
     * - o [output]
     */
    public static void to(Object output) {
        String cft = "[" + Thread.currentThread().getName() + "]";
        ThreadUtils.scheduleAtSeqExecute(() -> {
            System.out.println(cft + " " + output);
        });
    }

    /**
     * fo 输出：[调用方法] 日志内容
     * - f [function]
     * - o [output]
     */
    public static void fo(Object output) {
        String prefix = "[" + ReflectionUtil.getCallMethod() + "]";
        ThreadUtils.scheduleAtSeqExecute(() -> {
            System.out.println(prefix + " " + output);
        });
    }

    /**
     * cfo 输出：[调用类.调用方法] 日志内容
     * - c [class]
     * - f [function]
     * - o [output]
     */
    synchronized public static void cfo(Object output) {
        String prefix = "[" + ReflectionUtil.getCallClassAndMethod() + "]";
        ThreadUtils.scheduleAtSeqExecute(() -> {
            System.out.println(prefix + " " + output);
        });
    }

    /**
     * tcfo 输出格式：[执行线程|调用类.调用方法] 日志内容
     * - t [thread]
     * - c [class]
     * - f [function]
     * - o [output]
     */
    public static void tcfo(Object output) {
        String prefix = "[" + Thread.currentThread().getName() + "|" + ReflectionUtil.getCallClassAndMethod() + "]";
        ThreadUtils.scheduleAtSeqExecute(() -> {
            System.out.println(prefix + " " + output);
        });
    }
}
